package com.cskaoyan._02interface._01introduction;

/**
 * @description:
 * @author: 景天
 * @date: 2023/2/11 10:09
 **/
/*
现在我们有了新需求：一部分猫和狗，经过了特殊训练，能够直立行走了。
那么这群特殊的猫和狗，怎么描述它们呢？

分析：

部分猫和狗经过特殊训练，才能够直立行走。
所以不可能直接加个方法到Cat类和Dog类中，不是所有猫狗都有这个行为。
而特殊的猫狗仍然是猫和狗，所以它们肯定还要继承猫和狗这两个类。
可能很多同学，这时候想到的就是：重新定义两个新的猫狗类（比如超级狗和猫）继承猫狗，
然后给出直立行走的方法就算完事了。这样做不是不行，需求是实现了，但还有一些小问题：

1. 一方面没有体现代码复用。
2. 更重要的是，没有体现出特殊训练的过程。
假如还有一些动物也要直立行走，增加这个行为，如何体现出规范性、标准性呢？
体现出它们是特殊的经过训练的动物呢？

这里我们想到了抽象类，因为抽象类中抽象方法，可以强制约束子类实现它，
这样就是一种标准和规范，体现了它经过了特殊训练，和之前不同了。

于是我们定义抽象类，给出抽象方法，让超级猫狗类去继承这个抽象类，可行吗？

理想很美好，现实很骨感。显然做不到，因为Java不支持多继承。除开这点这么做也不是完美的，问题是：

1. 这个抽象类里面是对功能和行为的抽象，缺少属性（单独一个直立行走的行为是一个什么对象？）所以单独的行为不应该被抽象为类，不符合类的定义。
2. 继承这个抽象类也不符合继承的"is-a"关系，这里不适用继承（还是上面那句话，行为根本不是个体）

于是，我们就迫切需要一种全新的数据类型，这种全新的数据类型：

1. 不强调属性，只强调行为的抽象，"继承"它表示功能的扩展。
2. 在一个类继承某个类后，还能继续"继承"，不受Java单继承限制。
3. 没有"is-a"这种继承关系的限制。
4. 最好还有抽象方法。（因为它能表示规范和标准）

这种全新的数据类型，就是**接口（interface）**。

接口的定义:
    语法: 权限修饰符 interface 接口名{}
    说明:
        权限修饰符跟class一样
        interface关键字表示接口,跟class具有同等的地位,也是引用数据类型
        接口名要求大驼峰
        接口中可以放抽象方法,跟抽象类一样
        一个类可以继承接口,不用extends, 用implements(实现)来表示,通常继承某个类,实现某个接口
        一个类实现了某个接口,这个类就是接口的子类,接口是这个类的父接口
        一个类同时可以满足即继承了某个父类,又实现了某个接口,
            语法:
                权限修饰符 class 类名 extends 父类 implements 接口
                注意顺序不要错了
        并且这个类可以实现多个接口
                1)权限修饰符 class 类名 implements 接口1,接口2..

                2)权限修饰符 class 类名 extends 父类 implements 接口1,接口....
        接口是可以多继承的
 */
public class Demo {
    public static void main(String[] args) {

    }
}

abstract class Animal {
    public abstract void shout();
}

class Cat extends Animal {
    @Override
    public void shout() {
        System.out.println("猫叫");
    }
}

class Dog extends Animal {
    @Override
    public void shout() {
        System.out.println("狗叫");
    }
}

class SuperCat extends Cat implements SpecialSkill{
    @Override
    public void walkUp() {
        System.out.println("猫直立行走");
    }
    //public void walkUp() {
    //
    //}
}

class SuperDog extends Dog implements SpecialSkill{
    @Override
    public void walkUp() {

    }
    //public void walkUp() {
    //
    //}
}

//abstract class SpecialSkill{
//    abstract void walkUp();
//}

interface SpecialSkill{
    // 抽象方法 制定标准
    abstract void walkUp();
}

interface IA{

}

interface IB{

}


class A implements IA,IB{}


class B {

}

class C extends B implements IA,IB{}

// 接口是可以继承的,并且是多继承
interface IC extends IA ,IB{}